package cn.edu.sgu.www.mhxysy.util;

import cn.edu.sgu.www.mhxysy.exception.GlobalException;
import cn.edu.sgu.www.mhxysy.restful.ResponseCode;
import lombok.extern.slf4j.Slf4j;

import java.io.File;

/**
 *	File工具类
 * @author 沐雨橙风ιε
 * @version 1.0
 */
@Slf4j
public class FileUtils {

	/**
	 * 创建文件夹
	 * @param directory 文件夹名
	 */
	public static void createFolder(String directory) {
		File file = new File(directory);
		
		if(file.exists()) {
			if (file.isDirectory()) {
				log.debug("文件夹{}已存在···", directory);
			} else {
				throw new GlobalException(ResponseCode.CONFLICT, "创建失败，文件名重复！");
			}
		} else {
			boolean result = file.mkdirs();

			log.debug("文件夹{}创建{}", directory, result ? "成功。": "失败！");
		}
	}
	
	/**
	 * 删除文件，可以是文件或文件夹
	 * @param fileName 要删除的文件名
	 * @return 删除成功返回true，否则返回false
	 */
	public static boolean delete(String fileName) {
		File file = new File(fileName);
		
		if (file.exists()) {
			if (file.isFile()) {
				return deleteFile(fileName);
			} else if (file.isDirectory()){
				return deleteDirectory(fileName);
			}
		}

		log.debug("删除文件失败：{}不存在！", fileName);

		return false;
	}

	/**
	 * 删除单个文件
	 * @param fileName 要删除的文件的文件名
	 * @return 单个文件删除成功返回true，否则返回false
	 */
	private static boolean deleteFile(String fileName) {
		File file = new File(fileName);
		
		// 如果文件路径所对应的文件存在，并且是一个文件，则直接删除
		if (file.exists() && file.isFile()) {
			if (file.delete()) {
				log.debug("成功删除文件：{}", fileName);
				
				return true;
			} else {
				log.debug("删除文件{}失败！", fileName);

				return false;
			}
		} else {
			log.debug("删除文件失败！文件{}不存在！", fileName);
			
			return false;
		}
	}

	/**
	 * 删除目录及目录下的文件
	 * @param directory 要删除的目录的文件路径
	 * @return 目录删除成功返回true，否则返回false
	 */
	private static boolean deleteDirectory(String directory) {
		File dirFile = new File(directory);
		
		// 如果dir对应的文件不存在，或者不是一个目录，则退出
		if (!dirFile.exists()) {
			log.debug("删除目录失败！目录{}不存在！", directory);

			return false;
		}
		
		boolean flag = true;
		
		// 删除文件夹中的所有文件包括子目录
		File[] files = dirFile.listFiles();

		if (files != null && files.length > 0) {
			for (File file : files) {
				// 删除子文件
				if (file.isFile()) {
					flag = deleteFile(file.getAbsolutePath());

					if (!flag)
						break;
				}

				// 删除子目录
				else if (file.isDirectory()) {
					flag = deleteDirectory(file.getAbsolutePath());

					if (!flag)
						break;
				}
			}
		}
		
		if (!flag) {
			log.debug("删除目录失败！");
			
			return false;
		}
		
		// 删除当前目录
		if (dirFile.delete()) {
			log.debug("删除目录{}成功！", directory);

			return true;
		} else {
			return false;
		}
	}

}